package sanrenxing.analysis.dao.impl;

import sanrenxing.analysis.dao.AnalysisDao;
import sanrenxing.analysis.domain.Analysis;
import sanrenxing.analysis.domain.AnalysisTo;
import sanrenxing.utils.JdbcUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * 功能:
 * 编写者:
 * 创建时间：2020/10/13 9:17
 * 版本:
 */
public class AnalysisDaoImpl implements AnalysisDao {
    /**
     * 查询所有试题难易方法
     * @param rows 行数
     * @param pages 页数
     * @param condition 条件字符串
     * @return 返回试题难易集合
     */
    @Override
    public List<AnalysisTo> findByPage(int rows, int pages, String condition) {
        //声明数据库连接对象
        Connection conn=null;
        //声明预编译语句对象
        PreparedStatement pstmt=null;
        //声明结果集对象
        ResultSet rs=null;
        //定义试题难易To对象集合
        List<AnalysisTo> analysisToList=new ArrayList<AnalysisTo>();
        try {
            //实例化数据库连接对象
            conn= JdbcUtils.getConnection();
            //编写SQL查询语句，难易表与班级表连接，连接条件为班级编号相同，外加条件为condition以及分页，主要查询难易编号、试题编号、班级名称、正确人数、正确率、试卷编号
            String sql="SELECT an.analyId,an.subjectId,cl.className,an.rightNum,an.accRate,an.paperId FROM analysis an JOIN class cl ON an.classId=cl.classId WHERE 1=1 "+condition+" LIMIT ?,?";
            //实例化预编译语句对象
            pstmt=conn.prepareStatement(sql);
            //给分页语句占位符赋值
            //分页语句：select * from 表名 limits (pages-1)*rows,rows
            pstmt.setInt(1,(pages-1)*rows);
            //传入行数
            pstmt.setInt(2,rows);
            //使用预编译语句对象执行SQL语句，返回结果集
            rs=pstmt.executeQuery();
            //循环判断结果集，并把结果集的数据封装到学生对象中
            while(rs.next()){
                //创建试题难易To对象
                AnalysisTo analysisTo=new AnalysisTo();
                //把结果集数据赋值给试题难易To对象各属性
                analysisTo.setAnalyId(rs.getInt("analyId"));
                analysisTo.setSubjectId(rs.getInt("subjectId"));
                analysisTo.setClassName(rs.getString("className"));
                analysisTo.setRightNum(rs.getInt("rightNum"));
                analysisTo.setAccRate(rs.getDouble("accRate"));
                analysisTo.setPaperId(rs.getInt("paperId"));
                //把试题难易To对象添加学生集合中
                analysisToList.add(analysisTo);
            }
        } catch (SQLException e) {
            //抛出运行时异常
            throw new RuntimeException(e.getMessage(),e);
        } finally {
            //关闭/释放资源
            JdbcUtils.close(rs,pstmt,conn);
        }
        //返回员工对象集合
        return analysisToList;
    }

    /**
     * 条件统计
     *
     * @param condition 条件
     * @return 员工数
     */
    @Override
    public int count(String condition) {
        //声明数据库连接对象
        Connection conn=null;
        //声明预编译语句对象
        PreparedStatement pstmt=null;
        //声明结果集对象
        ResultSet rs=null;
        //定义返回表中总数据行数
        int rowCount=0;
        try {
            //实例化数据库连接对象
            conn= JdbcUtils.getConnection();
            //编写SQL查询语句，通过难易表查询行数，外加条件是condition
            String sql="select count(*) as counts from analysis where 1=1 "+condition;
            //实例化预编译语句对象
            pstmt=conn.prepareStatement(sql);
            //使用预编译语句对象执行SQL语句，返回结果集合
            rs=pstmt.executeQuery();
            //判断结果集，并获得总行数
            if(rs.next()){
                //如果统计行数时没有指定别名，则用数字0作为参数
                rowCount=rs.getInt("counts");
            }
        } catch (SQLException e) {
            //抛出运行时异常
            throw new RuntimeException(e.getMessage(),e);
        } finally {
            //关闭/释放资源
            JdbcUtils.close(null,pstmt,conn);
        }
        //返回表中数据总行数
        return rowCount;
    }

    /**
     * 获取查询条件
     *
     * @param analysis 员工对象
     * @return 条件字符串
     */
    @Override
    public String getCondition(Analysis analysis) {
        //定义一个保存条件的字符串变量
        String condition=" ";
        //如果学生对象为空，则直接返回空字符串
        if(analysis==null){
            //如果没有条件则返回空字符串
            return condition;
        }
        //如果序号（主键）不为空(字符串匹配模糊查询)
        if(analysis.getAnalysisId()!=0){
            condition += " and an.analysisId="+analysis.getAnalysisId();
        }
        //如果试题编号不为空
        if(analysis.getSubjectId()!=0){
            condition += " and an.subjectId="+analysis.getSubjectId();
        }
        //如果班级编号不为空
        if(analysis.getClassId()!=0){
            condition += " and an.classId="+analysis.getClassId();
        }
        //如果本题正确人数不为空
        if(analysis.getRightNum()!=0){
            condition += " and an.rightNum="+analysis.getRightNum();
        }
        //如果正确率不为空
        if(analysis.getAccRate()!=0){
            condition += " and an.accRate="+analysis.getAccRate();
        }

        //如果试卷编号不为空
        if(analysis.getPaperId()!=0){
            condition += " and an.paperId="+analysis.getPaperId();
        }
        //返回条件字符串
        return condition;
    }

    /**
     * 通过试卷编号取出考试结束时间
     *
     * @param paperId
     * @return
     */
    @Override
    public String findPaperFinishTime(int paperId) {
        //声明数据库连接对象
        Connection conn=null;
        //声明预编译语句对象
        PreparedStatement pstmt=null;
        //声明结果集对象
        ResultSet rs=null;
        //保存结束时间
        String finishTime;
        try {
            //实例化数据库连接对象
            conn= JdbcUtils.getConnection();
            //编写SQL查询语句，通过试卷表查询结束时间，外加条件为试卷编号
            String sql="SELECT finishTime FROM paper WHERE paperId=?";
            //实例化预编译语句对象
            pstmt=conn.prepareStatement(sql);
            //给占位符赋值
            pstmt.setInt(1,paperId);
            //使用预编译语句对象执行SQL语句，返回结果集合
            rs=pstmt.executeQuery();
            //判断结果集，并获得总行数
            if(rs.next()){
                //如果统计行数时没有指定别名，则用数字0作为参数
                finishTime=rs.getString("finishTime");
                //返回结束时间
                return finishTime;
            }
        } catch (SQLException e) {
            //抛出运行时异常
            throw new RuntimeException(e.getMessage(),e);
        } finally {
            //关闭/释放资源
            JdbcUtils.close(null,pstmt,conn);
        }
        //返回表中数据总行数
        return null;
    }

    /**
     * 查询到试题并修改其难易程度
     *
     * @param subjectId
     * @param accRate
     */
    @Override
    public void updateSubHard(int subjectId, int accRate) {
        //声明数据库连接对象
        Connection conn=null;
        //声明预编译语句对象
        PreparedStatement pstmt=null;
        try {
            //实例化数据库连接对象
            conn= JdbcUtils.getConnection();
            //定义sql语句的保存变量
            String sql;
            if (accRate==1){
                //编写SQL修改语句，修改题目表中的难度加一，外加条件是题目编号
                sql="UPDATE subjects SET hard=(hard+1) WHERE subjectId=?";
            }else{
                //编写SQL修改语句，修改题目表中的难度减一，外加条件是题目编号
               sql="UPDATE subjects SET hard=(hard-1) WHERE subjectId=?";
            }

            //实例化预编译语句对象
            pstmt=conn.prepareStatement(sql);
            //给占位符赋值
            pstmt.setInt(1,subjectId);
            //执行sql语句
            pstmt.executeUpdate();
        } catch (SQLException e) {
            //抛出运行时异常
            throw new RuntimeException(e.getMessage(),e);
        } finally {
            //关闭/释放资源
            JdbcUtils.close(null,pstmt,conn);
        }
    }

    /**
     * 删除难易程度的方法
     *
     * @param analyId
     */
    @Override
    public void deleteAnalysis(int analyId) {
        //声明数据库连接对象
        Connection conn=null;
        //声明预编译语句对象
        PreparedStatement pstmt=null;
        try {
            //实例化数据库连接对象
            conn= JdbcUtils.getConnection();
            //定义sql删除语句，删除难易表，外加条件是难易编号
            String sql="DELETE FROM analysis WHERE analyId=?";
            //实例化预编译语句对象
            pstmt=conn.prepareStatement(sql);
            //给占位符赋值
            pstmt.setInt(1,analyId);
            //执行sql语句
            pstmt.executeUpdate();
        } catch (SQLException e) {
            //抛出运行时异常
            throw new RuntimeException(e.getMessage(),e);
        } finally {
            //关闭/释放资源
            JdbcUtils.close(null,pstmt,conn);
        }
    }
}
